"""
__author__ = '霍格沃兹测试开发学社'
__desc__ = '更多测试开发技术探讨，请访问：https://ceshiren.com/t/topic/15860'
"""
import json

import requests

from backstage_management.utils.file_tools import FileTool
from backstage_management.utils.log_utils import logger


class BaseApi:

    def __init__(self):
        # 如何切换环境
        env_config = FileTool.read_yaml("env")
        default_env = env_config["default"]
        self.base_url = env_config[default_env]

        # self.base_url = base_url

    def __set_token(self, request_infos):
        """
        # 问题： 除登录接口之外，基本每一个接口，都需要另外去设置token
        # 解决方案：
            1. 在发起接口请求之前，就获取token信息
            2. 获取token信息之后，塞入到请求信息之中
                1. 除了method 和url 之外，所有的其他信息，包括header params 等等的其他参数，都会塞入至kwargs 不定长参数中
                cart_api -> send-> 获取kwargs -> 在kwargs 中 塞入header（鉴权）信息
        # 问题2: 如果有两个token存在怎么办？
        # 1. 不同的角色有不同的token信息

        :return:
        """
        if not hasattr(self, "final_token"):
            client_url = "wx/auth/login"
            client_data = {"username": "user123", "password": "user123"}
            client_r = requests.request("post", self.base_url + client_url, json=client_data)
            self.final_token = {"X-Litemall-Token": client_r.json()["data"]["token"]}
        # 获取headers， 如果请求本身有头信息，那么就把token信息更新进去
        if request_infos.get("headers"):
            request_infos["headers"].update(self.final_token)
        else:
            request_infos["headers"] = self.final_token
        return request_infos

    def send(self, method, url, **kwargs):
        # 问题1： 接口里面直接使用了requests
        # 解决方案： 在base_api中添加公共的send方法
        # 问题2：大量重复的base_url
        # 解决方案，在构造函数，实例化base_url，并且在send方法，就直接做拼接，这样子类的方法，就无需重复编写self.base_url
        # 优化3： token 的获取也放到了构造函数里面
        kwargs = self.__set_token(kwargs)
        r = requests.request(method, self.base_url + url, timeout=3, **kwargs)
        logger.debug(r.url)
        logger.debug(f"{self.base_url + url}接口的响应为{json.dumps(r.json(), indent=2, ensure_ascii=False)}")
        return r.json()
